// 通过使用Iteratee函数遍历数组中的每个元素，从而从原始数组中删除值。
const pullBy = (arr, ...args) => {
    const length = args.length;
    // 判断参数有没有传入函数
    let fn = length > 1 ? args[length - 1] : undefined;
    fn = typeof fn == "function" ? (args.pop(), fn) : undefined;
    // 从arg中删除传入函数，arg现在是传入的第二个参数的数组 .
    // eg:[[{ x: 1 }, { x: 3 }]]
  
    // map循环 用fn 取出 传入参数的值
    let argState = (Array.isArray(args[0]) ? args[0] : args).map((val) =>
      fn(val)
    );
  
    // filter取出原数组中含有argState的元素
    let pulled = arr.filter((v) => !argState.includes(fn(v)));
    // 原数组清空
    arr.length = 0;
    //   循环pulled,将元素push到原数组中
    pulled.forEach((v) => arr.push(v));
  };
  var myArray = [{ x: 1 }, { x: 2 }, { x: 3 }, { x: 1 }];
  pullBy(myArray, [{ x: 1 }, { x: 3 }], (o) => o.x);
  // myArray = [{ x: 2 }]
  
  
  
  
  
  